//配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';

import routes from './routes'

//为了拿到token，需要引入仓库state
import store from '@/store'
//使用插件——路由插件
Vue.use(VueRouter);

//优化
//若有成功和失败的回调，有则返回这俩值，无则自己手写() => {}
//先把VueRouter原型对象的push先保存一份
let originPush = VueRouter.prototype.push;
//先把VueRouter原型对象的replace先保存一份
let originReplace = VueRouter.prototype.replace;
//重写push|replace
//第一个参数location：告诉原来的push方法，你往哪里跳转（传递哪些参数）
//第二个参数resolve：成功回调。
//第三个参数reject：失败回调。
//call|apply区别
//相同点：都可调用函数一次，都可篡改函数的上下文一次。
//不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组。
VueRouter.prototype.push = function(location, resolve, reject) {
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => {}, () => {})
    }
}
VueRouter.prototype.replace = function(location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => {}, () => {})
    }
}



//配置路由
let router = new VueRouter({
    //配置路由
    routes: routes,
    scrollBehavior(to, from, savedPosition) {
        return { y: 0 }
    }
});

//全局守卫：前置守卫（在路由跳转之间进行判断）
router.beforeEach(async(to, from, next) => {
    //to:可获取到要跳转的那个路由信息
    //from:可获取到从哪个路由而来的信息
    //next:放行函数
    // 写法一：next()直接放行    写法二：next(path)放行到指定路由     写法三：next(false)若URL改变，则中断跳回from路由
    let token = store.state.user.token;
    //如果token是''，if(token)得到也是真，此时需要判断用户信息（用户名）
    let name = store.state.user.userInfo.name;
    //用户已经登录后
    if (token) {
        //用户已经登录了就不能去登录或注册页面，只允许停留在首页]
        if (to.path == '/login' || to.path == '/register') {
            next('/home')
                // console.log(11)
        } else {
            //登录但是不是去/login
            //若已存在用户名
            if (name) {
                next();
                // console.log(22)
            } else {
                //没有用户信息，则派发action让仓库存储用户信息再跳转
                try {
                    //在路由跳转之前获取用户信息展示
                    await store.dispatch('getUserInfo');
                    //有信息之后放行
                    next()
                        // console.log(33);
                } catch (error) {
                    //服务器过期了，token失效的情况下
                    //清除token(用了退出登录那里)
                    await store.dispatch('userLogout')
                    next('/login');
                }
            }
        }
    } else {
        //未登录的访问，无法访问交易相关（trade）、支付相关（pay、paysuccess）、用户中心相关（center），点击后只能跳转到登录页面。
        let toPath = to.path;
        //如果toPath中带有
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            //把未登录的时候去而未去成的信息，存储于地址栏【路由】中
            next('/login?redirect=' + toPath);
        } else {
            //对其他的组件访问均可放行
            next();
        }
    }
})

export default router;